// 用户模块 - 使用命名空间
const userModule = {
  namespaced: true, // 启用命名空间

  state: {
    // 用户信息
    userInfo: null,
    // token
    token: localStorage.getItem('token') || null,
    // 登录状态
    isLoggedIn: !!localStorage.getItem('token'),
    // 登录加载状态
    loginLoading: false,
    // 登录错误信息
    loginError: null,
  },

  getters: {
    // 获取用户信息
    getUserInfo: state => state.userInfo,
    // 获取token
    getToken: state => state.token,
    // 获取登录状态
    isLoggedIn: state => state.isLoggedIn,
    // 获取登录加载状态
    getLoginLoading: state => state.loginLoading,
    // 获取登录错误信息
    getLoginError: state => state.loginError,
    // 获取用户权限（示例）
    getUserPermissions: state => state.userInfo?.permissions || [],
  },

  mutations: {
    // 设置登录加载状态
    SET_LOGIN_LOADING(state, loading) {
      state.loginLoading = loading
    },

    // 设置登录错误信息
    SET_LOGIN_ERROR(state, error) {
      state.loginError = error
    },

    // 设置token
    SET_TOKEN(state, token) {
      state.token = token
      state.isLoggedIn = !!token
      if (token) {
        localStorage.setItem('token', token)
      } else {
        localStorage.removeItem('token')
      }
    },

    // 设置用户信息
    SET_USER_INFO(state, userInfo) {
      state.userInfo = userInfo
    },

    // 清除用户信息
    CLEAR_USER_INFO(state) {
      state.userInfo = null
    },

    // 清除登录状态
    CLEAR_LOGIN_STATE(state) {
      state.token = null
      state.isLoggedIn = false
      state.userInfo = null
      state.loginError = null
      localStorage.removeItem('token')
    },
  },

  actions: {
    // 用户登录
    async login({ commit }, loginData) {
      commit('SET_LOGIN_LOADING', true)
      commit('SET_LOGIN_ERROR', null)

      try {
        // 这里应该是实际的登录API调用
        // 示例：模拟登录请求
        const response = await new Promise(resolve => {
          setTimeout(() => {
            // 模拟成功响应
            resolve({
              data: {
                token: 'mock-jwt-token-' + Date.now(),
                userInfo: {
                  id: 1,
                  username: loginData.username,
                  email: loginData.username + '@example.com',
                  avatar: '/src/assets/userHeader.png',
                  permissions: ['read', 'write'],
                },
              },
            })
          }, 1000)
        })

        // 设置token和用户信息
        commit('SET_TOKEN', response.data.token)
        commit('SET_USER_INFO', response.data.userInfo)
        commit('SET_LOGIN_LOADING', false)

        return response.data
      } catch (error) {
        commit('SET_LOGIN_LOADING', false)
        commit('SET_LOGIN_ERROR', error.message || '登录失败')
        throw error
      }
    },

    // 用户登出
    logout({ commit }) {
      commit('CLEAR_LOGIN_STATE')
      // 可以在这里添加登出API调用
    },

    // 获取用户信息（用于页面刷新后重新获取）
    async fetchUserInfo({ commit, state }) {
      if (!state.token) {
        return
      }

      try {
        // 这里应该是实际的获取用户信息API调用
        const response = await new Promise(resolve => {
          setTimeout(() => {
            resolve({
              data: {
                id: 1,
                username: 'currentUser',
                email: 'user@example.com',
                avatar: '/src/assets/userHeader.png',
                permissions: ['read', 'write'],
              },
            })
          }, 500)
        })

        commit('SET_USER_INFO', response.data)
        return response.data
      } catch (error) {
        console.error('获取用户信息失败:', error)
        // 如果获取用户信息失败，清除token
        commit('CLEAR_LOGIN_STATE')
        throw error
      }
    },

    // 更新用户信息
    async updateUserInfo({ commit }, userInfo) {
      try {
        // 这里应该是实际的更新用户信息API调用
        const response = await new Promise(resolve => {
          setTimeout(() => {
            resolve({ data: userInfo })
          }, 500)
        })

        commit('SET_USER_INFO', response.data)
        return response.data
      } catch (error) {
        console.error('更新用户信息失败:', error)
        throw error
      }
    },

    // 刷新token
    async refreshToken({ commit, state }) {
      if (!state.token) {
        throw new Error('没有有效的token')
      }

      try {
        // 这里应该是实际的刷新tokenAPI调用
        const response = await new Promise(resolve => {
          setTimeout(() => {
            resolve({
              data: {
                token: 'refreshed-jwt-token-' + Date.now(),
              },
            })
          }, 500)
        })

        commit('SET_TOKEN', response.data.token)
        return response.data.token
      } catch (error) {
        console.error('刷新token失败:', error)
        commit('CLEAR_LOGIN_STATE')
        throw error
      }
    },
  },
}

export default userModule
